<?php
//这里面存放的都是后面系统中需要用到的辅助函数
/*
 *后台权限判断.
 * 这个函数中对传递进来的参数使用了类型约束,以免不合法的参数传递到函数中,加上这个类型的好处就是当传递不符合类型约束的参数方法直接报错,根本就不执行.
 * */
function access(String $permission){
    //通过调用auth()->check()方法判断当前用户是否已经登陆
    //调用该方法的时候,如果用户已经登陆了,并且通过调用user()对象的can方法判断是否有权限
    if (auth()->check() && auth()->user()->can($permission)){
        return true;
    }
    //如果不满足上面的条件就抛出异常
//    之所以要使用异常类是因为通过定义一个异常类首先可以达到复用的效果,其次是因为在函数中不能使用redirect()路由重定向
    throw  new \App\Exceptions\AccessException('你没有操作权限');
}

function admin_menus(){
    //从当前路由中获取到的一些信息的处理,获取到当前的模块儿
    $route = explode('/',Route::getCurrentRoute()->uri);
    //从模块儿数据表中将当前模块儿对应的后台菜单数组从admin_menu字段中取出来
    $menus = \App\Models\AdminModule::where('module',$route[0])->value('admin_menu');
    //动态将子栏目中的所有权限加到这些子栏目父级栏目的permission中
    foreach ($menus as $k=>$topmenu){
        $permission = [];
        foreach ($topmenu['menus'] as $menu){
            //下面这种方式不行,这个是得到字符串的但是我这里需要数组,需要将各个子栏目的权限都同意追加到一个$permission数组中
//            $permission .= $p['permission'];
//应该使用下面的方法将各个子栏目对应的权限追加到富栏目的permission数组中
            $permission[] = $menu['permission'];
        }
        $menus[$k]['permission'] = $permission;
    }
//    最后将结果返回,但是这里做了下判断,当$menus为真的时候取$menus但是不为真的时候赋值null
    return $menus?$menus:null;
}

//获取会员中心菜单的函数
function center_menus(){
   return $menu = \App\Models\AdminModule::where('center_menu_setting',true)->pluck('center_menu');
}

//获取网站配置信息的函数
function get_config($name,$default = null){
    $config = \App\Models\Config::pluck('data','module');
//    dd($config);
    return array_get($config,$name)??$default;
}
//保存网站配置信息的函数
function save_config(array $config){
//从当前路由信息中获取当前的模块名
    $route = explode('/',Route::getCurrentRoute()->uri);
    $data['module'] = $route[0];
    $data['data'] = $config;
    //修改从数据库中查找的某一条记录对象之后通过save()方法,将修改保存到数据库中
    \App\Models\Config::firstOrNew(['module'=>$route[0]])->fill($data)->save();
}


//根据路由设置css样式的类名
function route_class(){
    //首先从路由中获取当前的模块
    $module = explode('/',Route::getCurrentRoute()->uri)[0];
//    dd(Route::getCurrentRoute());返回的是一个和当前路由相关的一个Route对象
   // dd(Route::currentRouteName()); 从路由中获取当前路由name结果为edu.topic.show
    return str_replace('.','-',Route::currentRouteName());
}


